/**
 * CLASSE TelaProcessos
 *
 * Esta classe contem toda a implementacao do menu de processos do sistema. 
 * No arquivo "SistemaAdvocacia.java", um objeto desta classe eh criado no
 * metodo "menuPrincipal" para representar o menu de processos dentro do 
 * codigo.
 */

//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------

import java.util.Scanner;

/**
 * Inicio da especificacao da classe.
 */
public class TelaProcessos {

//------------------------------------------------------
// A T R I B U T O S
//------------------------------------------------------

	/**
	 * Armazena uma referencia para o objeto da classe ListagemProcessos utilizado
	 * por este menu. Este objeto serah acessado para consulta e/ou alteracao dos
	 * dados dos processos cadastrados no sistema.
	 */
	ListagemProcessos listaProcessos;
	
	/**
	 * Armazena uma referencia para o objeto da classe ListagemEventosProcessos utilizado
	 * por este menu. Este objeto serah acessado para consulta e/ou alteracao dos
	 * dados dos processos cadastrados no sistema.
	 */
	ListagemEventosProcessos listaEventos;

//------------------------------------------------------
// C O N S T R U T O R E S
//------------------------------------------------------
	
	/**
	 * Unico construtor da classe.
	 */
	public TelaProcessos() {
		this.listaProcessos = new ListagemProcessos();
		this.listaEventos = new ListagemEventosProcessos();
	}

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------
	
	/**
	 * METODO menu
	 * 		Mostra o menu de processos do sistema e controla a execucao de cada opcao. 
	 */
	public void menu() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Esta variavel serah usada para controlar o loop abaixo, implementado usando uma estrutura "while". Quando
		// o usuario escolher a opcao "Voltar ao menu principal", a variavel recebera o valor "true", que causara o
		// termino da repeticao.
		boolean sair = false;
		
		while(!sair) { // Enquanto o usuario nao escolher sair do menu de processos...
		
			// Mostra as opcoes do menu de processos para o usuario.
			System.out.println("\n--------------- MENU PROCESSOS --------------\n");
			System.out.println("  Lista de opcoes disponiveis:               ");
			System.out.println("      1 - Incluir Processo                   ");
			System.out.println("      2 - Incluir Evento em Processo         ");
			System.out.println("      3 - Consultar Processo por Numero      ");
			System.out.println("      4 - Consultar Processos de um Cliente  ");
			System.out.println("      5 - Consultar Agenda para um Mes       ");
			System.out.println("      6 - Voltar ao menu principal           \n");
			
			// Solicita ao usuario que digite o numero da opcao escolhida.
			System.out.print  ("   >>> Digite sua opcao: ");
			int opcao = entrada.nextInt();
			
			// Este "while" repete a leitura da opcao escolhida pelo usuario ate que este informe uma opcao valida,
			// ou seja, um numero de 1 a 6.
			while(opcao < 1 || opcao > 6) {
				System.out.println("ERRO: Opcao invalida!");
				System.out.print  ("   >>> Digite sua opcao novamente: ");
				opcao = entrada.nextInt();
			}
			
			// Este "switch" esta sendo usado para a exibicao da tela selecionada pelo usuario no menu processos,
			// a partir do numero da opcao escolhida por ele.
			switch(opcao) {
			
				case 1 : // Opcao "Incluir Processo". 
					incluiProcesso();
					break;
				
				case 2 : // Opcao "Incluir Eventos em Processo". 
					incluiEvento();
					break;
				
				case 3 : // Opcao "Consultar Processo por Numero". 
					consultaProcesso();
					break;
				
				case 4 : // Opcao "Consultar Processos de um Cliente". 
					consultaProcessosCliente();
					break;
					
				case 5 : // Opcao "Consultar Agenda para um Mes". 
					consultaAgenda();
					break;
					
				case 6 : // Opcao de "Voltar ao menu principal". 
					sair = true;
					
			} // fim do switch iniciado na linha 94
			
		} // fim do while iniciado na linha 68
		
	} // fim do metodo "menu"
	
	/**
	 * METODO incluiProcesso
	 * 		Mostra e gerencia a tela de inclusao de processo. Esta tela solicita ao usuario que digite todos
	 * dados de um novo processo e efetua o registro na lista de processos.
	 */
	public void incluiProcesso() {
	
		Processo p = new Processo();
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n------------ INCLUSAO DE PROCESSO -----------");
		System.out.println();
		
		// Consulta o cliente desejado
		Cliente c = mostraCliente();
		p.codCliente = c.codigo;
		
		// Faz a leitura dos dados do processo
		System.out.print("Numero do processo...: ");
		p.numero = Integer.parseInt(entrada.nextLine());
		System.out.print("Descricao............: ");
		p.descricao = entrada.nextLine().toUpperCase();
				
		// Inclui o novo processo na lista de processos
		listaProcessos.incluirProcesso(p);
	} // Fim do metodo "incluiProcesso"
	
	/**
	 * METODO mostraCliente
	 * 		Le o codigo de um cliente do usuario e mostra os dados desse cliente na tela.
	 * Os dados do cliente sao devolvidos dentro de um objeto da classe Cliente.
	 */
	public Cliente mostraCliente() {
	
		Scanner entrada = new Scanner(System.in);
		Cliente c;
		ListagemClientes listaClientes = new ListagemClientes();
		
		// A repeticao efetuada por este do...while serve para repetir a leitura do codigo
		// do cliente a ser consultado ateh que o usuario digite um numero que exista no cadastro.
		do {
		
			// Le o codigo do cliente digitado pelo usuario.
			System.out.print("Codigo do cliente...: ");
			int codCliente = Integer.parseInt(entrada.nextLine());
			
			// Procura pelo cliente no cadastro
			c = listaClientes.consultaPorCodigo(codCliente);
			if(c == null)
				System.out.println("Codigo nao cadastrado! Digite novamente.");
				
		} while(c == null);
		
		// Mostra os dados do cliente na tela.
		System.out.println("Nome.....: " + c.nome);
		System.out.println("Endereco.: " + c.endereco);
		System.out.println("Telefone.: " + c.telefone);
		System.out.println("E-mail...: " + c.email);

		// Retorna a referencia para o objeto que contem os dados do cliente consultado.
		return c;
	} // Fim do metodo mostraCliente
	
	/**
	 * METODO mostraProcesso
	 * 		Le o numero de um processo do usuario e mostra os dados desse processo na tela.
	 * Os dados do Processo sao devolvidos dentro de um objeto da classe Processo.
	 */
	public Processo mostraProcesso() {
	
		Scanner entrada = new Scanner(System.in);
		Processo p;
				
		// A repeticao efetuada por este do...while serve para repetir a leitura do numero
		// do processo a ser consultado ateh que o usuario digite um numero que exista no cadastro.
		do {
		
			// Le o numero do processo digitado pelo usuario.
			System.out.print("Numero do processo...: ");
			int numProcesso = Integer.parseInt(entrada.nextLine());
			
			// Procura pelo processo no cadastro
			p = listaProcessos.consultaPorNumero(numProcesso);
			if(p == null)
				System.out.println("Processo nao cadastrado! Digite novamente.");
				
		} while(p == null);
		
		// Le os dados do cliente do processo
		ListagemClientes listaClientes = new ListagemClientes();
		Cliente c = listaClientes.consultaPorCodigo(p.codCliente);
		
		// Mostra os dados do processo na tela.
		System.out.println("Descricao.....: " + p.descricao);
		System.out.printf( "Cliente.......: %04d - %s\n", c.codigo, c.nome);

		// Retorna a referencia para o objeto que contem os dados do processo consultado.
		return p;
	} // Fim do metodo mostraProcesso
	
	/**
	 * METODO incluiEvento
	 * 		Mostra e gerencia a tela de inclusao de evento. Esta tela solicita ao usuario que digite todos
	 * dados de um novo evento e efetua o registro na lista de eventos.
	 */
	public void incluiEvento() {
	
		EventoProcesso e = new EventoProcesso();
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n------------- INCLUSAO DE EVENTO ------------");
		System.out.println();
		
		// Procura e mostra o processo desejado
		Processo p = mostraProcesso();
		e.numeroProcesso = p.numero;
		
		// Faz a leitura dos dados do evento
		System.out.print("Data e Hora (DD/MM/AAAA/HH/Min).: ");
		e.dataHora = new DataHora(entrada.nextLine());
		System.out.print("Descricao.......................: ");
		e.descricao = entrada.nextLine().toUpperCase();
				
		// Inclui o novo evento na lista de eventos
		listaEventos.incluirEvento(e);
	} // Fim do metodo "incluiEvento"
	
	/**
	 * METODO consultaProcesso
	 * 		Le o numero de um processo e mostra os seus dados, incluindo a lista de todos os eventos.
	 */
	public void consultaProcesso() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n------ CONSULTA DE PROCESSO POR CODIGO ------");
		System.out.println();
		
		// Procura e mostra os dados do processo
		Processo p = mostraProcesso();
		
		// Consulta os eventos do processo
		EventoProcesso[] eventos = p.consultaEventos();
		
		if(eventos.length > 0) {
			
			// Mostra o cabecalho da tabela que contera os dados dos eventos encontrados.
			System.out.println("\nDATA-HORA          DESCRICAO");	
			System.out.println("----------------   ------------------------------------------------------");	
			
			// Mostra os dados dos eventos, sendo uma linha para cada evento.
			for(int i = 0; i < eventos.length; i++) {
				System.out.printf("%s   %s\n",
									eventos[i].dataHora.geraString(),
									eventos[i].descricao);
			}
		} else {
			System.out.println("\nNenhum evento cadastrado para o processo.");
		}
		
		// Aguarda ateh que o usuario pressione a tecla ENTER. Isso foi colocado aqui para que
		// o usuario possa ler as informacoes mostradas.
		System.out.print("\nPressione ENTER para continuar...");
		entrada.nextLine();
	} // Fim do metodo consultaProcesso
	
	/**
	 * METODO consultaProcessosCliente
	 * 		Le o codigo de um cliente do usuario e mostra os processos cadastrados para
	 * esse cliente.
	 */
	public void consultaProcessosCliente() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n----- CONSULTA DE PROCESSOS POR CLIENTE -----");
		System.out.println();
		
		// Procura e mostra os dados do cliente
		Cliente c = mostraCliente();
		
		// Procura os processos do cliente
		Processo[] processos = c.consultaProcessos();
		
		if(processos.length > 0) {
			
			// Mostra o cabecalho da tabela que contera os dados dos processos encontrados.
			System.out.println("\nNUM. - DESCRICAO");	
			System.out.println("----   ------------------------------------------------------");	
			
			// Mostra os dados dos processos, sendo uma linha para cada processo.
			for(int i = 0; i < processos.length; i++) {
				System.out.printf("%04d - %s\n",
									processos[i].numero,
									processos[i].descricao);
			}
		} else {
			System.out.println("\nNenhum processo cadastrado para o cliente.");
		}
		
		// Aguarda ateh que o usuario pressione a tecla ENTER. Isso foi colocado aqui para que
		// o usuario possa ler as informacoes mostradas.
		System.out.print("\nPressione ENTER para continuar...");
		entrada.nextLine();
	} // Fim do metodo consultaProcessosCliente
	
	/**
	 * METODO consultaAgenda
	 * 		Le um mes e ano e mostra os eventos de todos os processos neste mes.
	 */
	public void consultaAgenda() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n-------- CONSULTA AGENDA PARA UM MES --------");
		System.out.println();
		
		// Faz a leitura dos dados do mes
		System.out.print("Mes.: ");
		int mes = Integer.parseInt(entrada.nextLine());
		System.out.print("Ano.: ");
		int ano = Integer.parseInt(entrada.nextLine());
		
		// Procura pelos eventos do mes
		EventoProcesso[] eventos = listaEventos.consultaPorMes(mes, ano);
		
		if(eventos.length > 0) {
			
			// Mostra o cabecalho da tabela que contera os dados dos eventos encontrados.
			System.out.println("\nDATA-HORA          PROCESSO   DESCRICAO");	
			System.out.println("----------------   --------   -------------------------------------------------");	
			
			// Mostra os dados dos eventos, sendo uma linha para cada evento.
			for(int i = 0; i < eventos.length; i++) {
				System.out.printf("%s   %08d   %s\n",
									eventos[i].dataHora.geraString(),
									eventos[i].numeroProcesso,
									eventos[i].descricao);
			}
		} else {
			System.out.println("\nNenhum evento cadastrado para o mes especificado.");
		}
		
		// Aguarda ateh que o usuario pressione a tecla ENTER. Isso foi colocado aqui para que
		// o usuario possa ler as informacoes mostradas.
		System.out.print("\nPressione ENTER para continuar...");
		entrada.nextLine();
	} // Fim do metodo consultaAgenda
	
} // fim da classe TelaProcessos